#ifndef __EVENTLOOP_H__
#define __EVENTLOOP_H__

#define AE_NONE 0
#define AE_READABLE 1
#define AE_WRITABLE 2

#include "cacheAlloc.h"

typedef void(*fileProc)(int fd, void* clientdata, int mask);
//对应服务器处理事件类型
struct fileEvent
{
  int mask_;
  fileProc rfileproc_;//读操作
  fileProc wfileproc_;//写操作
  void* conn_data_;//保存连接指针
};

struct fireEvent
{
  int fd_;
  int mask_;
};


class eventLoop
{
public:
  eventLoop(int setsize);
  ~eventLoop()
  {
    setsize_ = 0;
    tcfreeArray(fileEvent, ets_);
    tcfreeArray(fireEvent, fire_ets_);
  }

  static void connSocketEventHandler(int fd, void* clientdata, int mask);
  static void acceptEvent(int fd, void* clientdata, int mask);

  int createFileEvent(int fd, int mask, fileProc func, void* connData);
  int deleteFileEvent(int fd, int mask);
  
  int processEvents();
  
  int setsize_;
  //服务器需要处理客户端的事件，索引是fd
  //对应epoll就是将epoll_event转化为fileEvent
  struct fileEvent* ets_;
  //ets_里的处理事件不能修改，因为下次可能还是原来的处理事件
  //所以放到fire_ets中
  struct fireEvent* fire_ets_;
  //保存使用不同多路复用时的结构
  void* state_;
};



#endif